/*
Copyright (c) [2019年5月1日] [吴超]
[MBT_Studio] is licensed under Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
		 http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
See the Mulan PSL v2 for more details.
*/
#include "stdafx.h"
#include "C_物理物体插座.h"
#include "通用插座.h"

#include <场景/场景.h>
#include <物理/物理.h>

#include <ppl.h>



using namespace std;






S_Props f_创建物理引擎类型属性数据() {
	S_Props prop = f_alloc_EnumProp(nullptr, {
		{ L"mujoco", "" },
		{ L"Bullet", "" },
		{L"PBF", ""},
		{L"FleX", ""},
		{L"PhysX", ""},
		{L"FLIP", ""},
		
		
		{L"ODE", ""},
		{L"NewTon", ""},
		{L"Chrono", ""},

		}
	, L"物理体类型", 0);

	return prop;
}

S_Props f_创建物理几何类型属性数据() {
	S_Props prop = f_alloc_EnumProp(nullptr, {
		{ L"方体", "" },
		{ L"圆柱", "" },
		{ L"球体", ""},
		{ L"胶囊", ""},
		{ L"凸壳", ""},
		{ L"平面", ""},

		{ L"网格", ""},
		{ L"地形", ""},

		}
	, L"物理几何类型", 0);

	return prop;
}






C_物理解算器插座::C_物理解算器插座(std::wstring name) :C_插座基类(name, E_值类型::e_插座Type_物理解算器) {
	m_Physics = nullptr;
}

void* C_物理解算器插座::f_getData(uint8 当前插座连接线ID) {
	C_插座基类* socket = f_getLinkOutSocket(当前插座连接线ID);
	if (socket) {
		if (socket->m_Type == E_值类型::e_插座Type_物理解算器) {
			return socket->f_getData(当前插座连接线ID);
		}
		else if (socket->m_Type == E_值类型::e_插座Type_引用数据) {
			auto& 引用数据 = *DEF_引用插座数据(socket, 当前插座连接线ID);
			if (引用数据.m_Type == E_值类型::e_插座Type_物理解算器) {
				m_Physics = (S_Physics*)引用数据.m_Data;
			}
		}
		else {
			//m_Value = m_默认数据;
		}
	}
	return m_Physics;
}

void C_物理解算器插座::f_setData(void* data, uint8 线程ID) {
	m_Physics = (S_Physics*)data;
}









C_物理材质插座::C_物理材质插座(wstring name) :C_插座基类(name, E_值类型::e_插座Type_物理材质) {
	auto scene = f_scene_get场景(0);
	if (!scene) {
		m_默认数据 = 0;
		return;
	}
	m_默认数据 = f_创建材质(&(scene->m_Physics), 0.5, 0.5, 0.5);

	m_Value = m_默认数据;
}

void* C_物理材质插座::f_getData(uint8 线程ID) {
	C_插座基类* socket = f_getLinkOutSocket();
	if (socket) {
		if (socket->m_Type == E_值类型::e_插座Type_物理材质) {
			return DEF_物理材质插座Value(socket, 线程ID);
		} else {
			m_Value = m_默认数据;
		}
	}
	return m_Value;
}

void C_物理材质插座::f_setData(void* data, uint8 线程ID) {
	
}















C_物理几何插座::C_物理几何插座(wstring name) :C_插座基类(name, E_值类型::e_插座Type_物理体) {
	m_默认碰撞类型 = E_物理碰撞几何类型::E_碰撞几何_凸壳;
	m_默认碰撞类型 = E_物理碰撞几何类型::E_碰撞几何_凸壳;
	m_Value.m_Type = E_物理碰撞几何类型::E_碰撞几何_凸壳;
	m_Value.m_Data = 0;

	m_物理引擎 = E_物理引擎::E_物理引擎_Chrono;
}

void* C_物理几何插座::f_getData(uint8 线程ID) {
	C_插座基类* socket = f_getLinkOutSocket();
	if (socket) {
		if (socket->m_Type == E_值类型::e_插座Type_物理体) {
			return dynamic_cast<C_物理几何插座*>(socket)->f_getData(线程ID);
		}
		else {
			//m_Value = m_默认数据;
		}
	}
	return &m_Value;
}

void C_物理几何插座::f_setData(void* data, int64 ID) {

}

/*S_物理几何体* f_从网格创建物理几何碰撞对象(S_物理解算器* phy, S_网格插座数据& mesh, E_物理碰撞几何类型 type, E_物理引擎 e) {
	S_物理几何体* phyBody = 0;


	S_三角Mesh 三角形;
	三角形.m_vert = mesh.m_顶点->data();
	三角形.m_vNum = mesh.m_顶点->size();


	if (type == E_物理碰撞几何类型::E_碰撞几何_凸壳) {
		phyBody = f_创建凸壳物理包围几何(phy, 三角形, e);
	}
	else if (type == E_物理碰撞几何类型::E_碰撞几何_网格) {
		vector<uvec3> 顶点索引;
		f_顶点索引扁平化(*(mesh.m_索引), 顶点索引);

		三角形.m_index = 顶点索引.data();
		三角形.m_iNum = 顶点索引.size();

		phyBody = f_创建网格物理包围几何(phy, 三角形, e);
	}

	return phyBody;
}*/






/*C_物理体插座::C_物理体插座(string name) :C_插座基类(name, E_值类型::e_插座Type_物理体) {

}

void* C_物理体插座::f_getData()
{
	return nullptr;
}

void C_物理体插座::f_setData(void* data, int64 ID)
{
}







































C_车轮属性插座::C_车轮属性插座(string name) :C_插座基类(name, E_值类型::e_插座Type_车轮){

}

C_车轮属性插座::~C_车轮属性插座() {

}

void* C_车轮属性插座::f_getData() {
	C_插座基类* socket = f_getLinkOutSocket();
	if (socket) {
		if (socket->m_Type == E_值类型::e_插座Type_车轮) {
			return DEF_车轮属性插座Value(socket);
		}
	}
	return &m_Value;
}

void C_车轮属性插座::f_setData(void* data, int64 ID) {
	m_Value = *(S_车轮参数*)data;
}

PyObject* C_车轮属性插座::f_输出_bl数据(PyObject* bl_data) {
	auto& data = *DEF_车轮属性插座Value(this);

	//data.m_车辆物理体;
	PyObject* r = PyList_New(2);
	if (bl_data != (PyObject*)0xffffffff) {

	}
	else {
		//S_Px车轮* body = dynamic_cast<S_Px车轮*>(data.m_车轮物理体);

		PyList_SetItem(r, 0, f_string转PyObject("车轮物理配置"));
		PyList_SetItem(r, 1, Py_BuildValue("i", data.m_车轮物理体->f_get几何体物理对象()));
		
	}

	return r;
}




















C_车辆属性插座::C_车辆属性插座(string name)
	:C_插座基类(name, E_值类型::e_插座Type_车辆)
{
	m_车体属性.type = E_值类型::e_插座Type_车辆;
	//m_车体属性.m_车轮属性.resize(4);

}

C_车辆属性插座::~C_车辆属性插座()
{
}



void* C_车辆属性插座::f_getData() {
	S_车体属性* data = (S_车体属性*)C_插座基类::f_getData();
	if (data) {
		return data;
	}
	
	return &m_车体属性;
}

void C_车辆属性插座::f_setData(void* data, int64 ID) {
	C_插座基类::f_setData(data);

	if (m_是否为输出插座) {
		m_车体属性 = *(S_车体属性*)data;
	}
	
}*/

